package com.songcha.sakura.download.m3u8

import android.os.Parcel
import android.os.Parcelable
import java.net.MalformedURLException
import java.net.URL
import java.util.regex.Pattern

class M3u8TsConverter() : IM3u8TsConverter,Parcelable {
    constructor(parcel: Parcel) : this() {
    }

    override fun convert(m3u8Url: String, tsUrls: List<String>):List<String> {
        //m3u8Url:m3u8文件，包含ts文件
        //tsUrls:所有的ts文件
        /*某些ts文件带有全路径，如：http://xxxx.xxx.com/xxx.ts
         *有些没有只有相对路径，如：/20210927/3oCoCiM4/hls/xx.ts
         * 有些只有文件名，如：xxx.ts
         *因此需要区分，区分规则如下：
         * 如果包含有http或者https，一定是全路径，直接访问
         * 如果只有相对则是用域名+ts文件路径，如：(域名)http://xxxx.xxx.com/20210927/3oCoCiM4/hls/0.ts(路径)
         * 如果只有文件名，则是1 截取0到xxx.m3u8(不包含)的路径 2加上ts文件名，如：
         * http://xxxx.xxx.com/20210927/3oCoCiM4/index.m3u8
         * 去掉路径中xxx.m3u8的路径
         * http://xxxx.xxx.com/20210927/3oCoCiM4/
         * 加上ts文件名
         */

        //m3u8Url:m3u8文件，包含ts文件
        //tsUrls:所有的ts文件
        /*某些ts文件带有全路径，如：http://xxxx.xxx.com/xxx.ts
         *有些没有只有相对路径，如：/20210927/3oCoCiM4/hls/xx.ts
         * 有些只有文件名，如：xxx.ts
         *因此需要区分，区分规则如下：
         * 如果包含有http或者https，一定是全路径，直接访问
         * 如果只有相对则是用域名+ts文件路径，如：(域名)http://xxxx.xxx.com/20210927/3oCoCiM4/hls/0.ts(路径)
         * 如果只有文件名，则是1 截取0到xxx.m3u8(不包含)的路径 2加上ts文件名，如：
         * http://xxxx.xxx.com/20210927/3oCoCiM4/index.m3u8
         * 去掉路径中xxx.m3u8的路径
         * http://xxxx.xxx.com/20210927/3oCoCiM4/
         * 加上ts文件名
         */
        val newTslist: MutableList<String> = ArrayList()
        val pattern = "[0-9a-zA-Z]+[.]ts"
        val r = Pattern.compile(pattern)
        for (i in tsUrls.indices) {
            val tspath = tsUrls[i]
            val m = r.matcher(tspath)
            //全路径
            if (tspath.contains("http://") || tspath.contains("https://")) {
                newTslist.add(tspath)
            } else if (m.find()) {
                //判断是否包含重复路径
                var url: URL? = null
                url = try {
                    URL(m3u8Url)
                } catch (e: MalformedURLException) {
                    throw RuntimeException(e)
                }
                val host = url!!.getProtocol() + "://" + url!!.getHost() //+ ":" + url.getDefaultPort();

                //String repeat=tspath.substring(0, tspath.lastIndexOf("/")+1);
                var repeat = m3u8Url.replace(host, "")
                repeat = repeat.substring(0, repeat.lastIndexOf("/") + 1)
                if (repeat != "" && tspath.contains(repeat)) {
                    if (tspath.startsWith("/")) newTslist.add(host + tspath) else newTslist.add("$host/$tspath")
                } else {
                    val str = m3u8Url.substring(0, m3u8Url.lastIndexOf("/") )
                    if (tspath.startsWith("/")) {
                        newTslist.add(str + tspath)
                    } else {
                        newTslist.add("$str/$tspath")
                    }
                }
            } else {
                var host: String? = null
                host = try {
                    URL(m3u8Url).host
                } catch (e: MalformedURLException) {
                    throw RuntimeException(e)
                }

                //String host= Host.gethost(m3u8Url);
                newTslist.add("$host/$tspath")
            }
        }

        return newTslist
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {

    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<M3u8TsConverter> {
        override fun createFromParcel(parcel: Parcel): M3u8TsConverter {
            return M3u8TsConverter(parcel)
        }

        override fun newArray(size: Int): Array<M3u8TsConverter?> {
            return arrayOfNulls(size)
        }
    }

}